from utils import log_info, log_exception, log_error, log_debug
import os
import time
from dao.questions_dao import QuestionDAO
from dao.db_init import reset_questions
from typing import List, Dict, Any, Tuple
from services.importers import import_json, import_excel, import_csv, import_pdf


class ImportService:
    """导入服务类"""

    def __init__(self):
        """
        初始化导入服务
        """

        self.question_dao = QuestionDAO()
        # 初始化各类导入器
        self.json_importer = import_json
        self.excel_importer = import_excel
        self.csv_importer = import_csv
        self.pdf_importer = import_pdf

    def reset_database(self) -> bool:
        """
        重置数据库
        :return: 是否重置成功
        """
        try:
            success = reset_questions()
            if success:
                log_debug("已重置题库表")
            else:
                log_error("重置题库表失败")
            return success
        except Exception as e:
            log_exception(f"重置数据库时发生异常: {str(e)}")
            return False

    def import_questions(self, questions: List[Dict[str, Any]]) -> Tuple[bool, str, int, Dict[str, Any]]:
        """
        导入题目到数据库
        :param questions: 题目数据列表
        :return: (是否成功, 消息, 成功导入数量, 统计信息)
        """
        try:
            log_debug(f"开始导入数据到数据库")
            total = len(questions)
            if total == 0:
                log_error("没有题目数据可导入")
                return False, "题库文件为空", 0, {}

            # 重置数据库
            if not self.reset_database():
                return False, "重置题库表失败", 0, {}

            # 批量插入题目
            success = self.question_dao.batch_insert(questions)
            if success:
                log_debug(f"题库导入完成，成功导入{total}道题目")
                return True, "导入成功", total, {}
            else:
                log_error("批量插入题目失败")
                return False, "批量插入题目失败", 0, {}

        except Exception as e:
            log_exception(f"导入数据库时发生异常: {str(e)}")
            return False, str(e), 0, {}

    def process_unified_data(self, file_path, progress_var=None, progress_label=None, import_dialog=None):
        """根据文件类型自动处理数据并导入数据库"""
        try:
            log_debug(f"开始处理文件: {file_path}")
            # 获取文件扩展名
            file_ext = os.path.splitext(file_path)[1].lower()
            start_time = time.time()

            if progress_label and import_dialog:
                progress_label.config(text=f"开始导入 {os.path.basename(file_path)}...")
                import_dialog.update_idletasks()
            log_debug(f"文件类型: {file_ext}")

            # 根据文件类型选择对应的处理方法
            if file_ext == '.json':
                # 调用JSON数据处理方法
                log_debug("调用JSON数据处理方法")
                success, result, imported_cont, total, stats = self.json_importer.process_json_data(file_path, progress_var, progress_label, import_dialog)
                return success, result, imported_cont, total, stats
            elif file_ext == '.xlsx' or file_ext == '.xls':
                # 调用Excel数据处理方法
                log_debug("调用Excel数据处理方法")
                success, result, imported_cont, total, stats = self.excel_importer.process_excel_data(file_path, progress_var, progress_label, import_dialog)
                return success, result, imported_cont, total, stats
            elif file_ext == '.csv':
                # 调用CSV数据处理方法
                log_debug("调用CSV数据处理方法")
                success, result, imported_cont, total, stats = self.csv_importer.process_csv_data(file_path, progress_var, progress_label, import_dialog)
                return success, result, imported_cont, total, stats
            elif file_ext == '.zip':
                # 调用PDF数据处理方法
                log_debug("调用PDF数据处理方法")
                success, result, imported_cont, total, stats = self.pdf_importer.process_pdf_data(file_path, progress_var, progress_label, import_dialog)
                return success, result, imported_cont, total, stats
            else:
                log_error(f"不支持的文件类型: {file_ext}")
                return False, f"不支持的文件类型: {file_ext}", 0, 0, {}

        except Exception as e:
            log_exception(f"处理统一导入时发生异常: {str(e)}")
            return False, str(e), 0, 0, {}